package cn.good.yan;

import cn.good.yan.mapper.EmpMapper;
import cn.good.yan.pojo.Emp;
import cn.good.yan.service.EmpService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 测试 1
 *  1 测试基本CURD
 *  2 测试 自定义SQL 查询
 *     // 雪花算法
 *     // 数据库扩展 - 主从复制、数据库分库（水平、垂直）
 *     // 水平分表方式：
 *     // 1.主键自增  （1-1000）1表 （1000-2000）2表 （1000-2000）3表
 *     // 优点：扩展新表，原数据不动。缺点：分布不均匀、（比如2001 单独存一张表）分段大小难取，
 *     // 2.取模
 *     // 优点：分布均匀 缺点：扩展，需要重新更改原有的表数据
 *     // 3.雪花算法
 *     // 分布式主键生产的算法，保证不同表的主键生成主键不同。整个微服务不会产生id碰撞
 * @author shengren.yan
 * @create 2023-09-23
 */
@SpringBootTest
public class test1CURD {

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpService empService;

    /**
     * 1 测试 CURD  （Mapper层）
     */
    @Test
    public void test1(){
        // 1. 查询全部数据
        List<Emp> emps = empMapper.selectList(null);
        System.out.println(emps);

        // 2. 新增
        Emp emp1 = new Emp();
        emp1.setAge(13);
        emp1.setName("林先生");
        emp1.setDid(1);
        int insert = empMapper.insert(emp1);
        System.out.println(emp1);

        // 3. 删除
        int i = empMapper.deleteById(9L); // 参数id
        // 3.1 批量删除
        int i1 = empMapper.deleteBatchIds(Arrays.asList(11L, 10L));
        // 3.2 根据条件删除  注：key 是表字段
        Map<String,Object> mapdel = new HashMap<>();
        mapdel.put("name","修改的");
        mapdel.put("age","13");
        empMapper.deleteByMap(mapdel);

        // 4. 修改
        Emp emp2 = new Emp();
        emp2.setId(12);
        emp2.setName("修改的");
        int i2 = empMapper.updateById(emp2);

        // 5. 查询  - 根据多个ids
        Emp empO = empMapper.selectById(12L);
        List<Emp> all = empMapper.selectBatchIds(Arrays.asList(1L, 2L));
        System.out.println(all);
        // 根据查询条件查询
        Map<String,Object> map = new HashMap<>(); map.put("name","修改的");map.put("age","13");
        List<Emp> bills = empMapper.selectByMap(map);
        System.out.println(bills);

    }

    /**
     * 2 测试 自定义SQL 查询
     */
    @Test
    public void test2(){
        // 自定义查询
        List<Emp> emps = empMapper.selectByDid(1);
        System.out.println(emps);

    }

    /**
     * 3 测试 CURD  （Server层）
     */
    @Test
    public void test3(){
        // 1.查出总记录数
        long count = empService.count();
        // long count2 = empService.count(new QueryWrapper<Emp>());
        System.out.println(count);
        // 2.根据主键id查询
        Emp byId = empService.getById(3L);
        // 3.查询全部
        List<Emp> all = empService.list();
        // List<Emp> all2 = empService.list(new QueryWrapper<Emp>());
        System.out.println(all);

        // 4.新增
        empService.save(new Emp());
        // 5.修改
        empService.updateById(new Emp());
        // empService.update(new QueryWrapper<Emp>());

        // 6.新增或修改 ， 有主键代表修改，否则新增
        empService.saveOrUpdate(new Emp());
        // 7.批量新增
        List<Emp> alls = Arrays.asList(
                new Emp("王1", 1),
                new Emp("琳2", 33),
                new Emp("凯3", 32));
        boolean b = empService.saveBatch(alls);
        // 8.批量新增或修改 ， 有主键代表修改，否则新增
        empService.saveOrUpdateBatch(alls);

        // 9.根据主键 删除
        empService.removeById(20L);
        empService.remove(new QueryWrapper<Emp>());
        // 10.批量删除
        empService.removeBatchByIds(Arrays.asList(11L, 10L));

    }

}
